iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
Mobile Development

SwiftUI 的大大小小系列 第 5

Day 5 - SwiftUI 和 Optional 屬性的綁定

  • 分享至 

  • xImage
  •  

hero

前一篇是提到「在 SwiftUI 的 View 達成以 protocol 為 @ObservedObject 屬性的型別」,雖然本系列文章基本上沒有前後關聯,如果你是還沒讀過前一篇的讀者,也推薦你去讀讀。

問題描述

有沒有遇過資料來源是 optional ,但是 SwiftUI 卻無法接受的情形?

在 UIKit ,像是 UITextField 的 text 是 optional ,但是在 SwiftUI 的 TextField ,是無法傳入的。

利用 Binding

這時候就可以用 Biniding 做一層中介,在 Binding 的初始化進行 optional chaining 給予預設值,例如空字串。

struct CustomTextField: View {
    @Binding var title: String?
    var body: some View {
        TextField("在這裡幫文章下個好標題...", text: Binding(get: {
            title ?? ""
        }, set: { newValue in
            title = newValue.isEmpty ? nil : newValue
        }))
    }
}

使用時就像這樣:

struct ContentView: View {
    @State var title: String?
    var body: some View {
        CustomTextField(title: $title)
    }
}

參考文件

應用

在建立 custom UI 時可以活用這個方法,根據商業需求不同有可能會有 optional 的資料項,這時候就可以像這樣收納起來,在 UI 的最表層就不用看到很多 optional 的處理。

那今天的 SwiftUI 的大大小小就到這邊,以上,明天見!


上一篇
Day 4 - 在 SwiftUI 的 View 達成以 protocol 為 @ObservedObject 屬性的型別
下一篇
Day 6 - SwiftUI 中 ViewModifier 的基本實作
系列文
SwiftUI 的大大小小30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言